package com.tangruojie.manager;

import com.tangruojie.spi.Plugin;

import java.util.*;

/**
 * 插件管理器
 */
public class PluginManager {

    /**
     * 使用 static 在这里的全部好处
     * 好处	                    原因
     * ✅ 全局唯一插件缓存	        静态变量保存插件列表
     * ✅ 启动时只加载一次	        静态代码块初始化
     * ✅ 使用方便	            静态方法直接调用
     * ✅ 性能更优	            避免每次反射遍历
     * ✅ 实现“插件中心”模式	    模拟类似“注册中心”、“服务仓库”的效果
     */

    /*public static List<Plugin> loadPlugins() {
        ServiceLoader<Plugin> loader = ServiceLoader.load(Plugin.class);
        List<Plugin> plugins = new ArrayList<>();
        loader.iterator().forEachRemaining(plugins::add);
        return plugins;
    }*/

    /**
     * 静态字段 pluginMap 用于全局缓存插件
     * 整个类共享一个插件表（缓存池）；
     * 多次调用 getPlugin() / loadPlugins() 不需要重复加载；
     * 减少重复 IO 操作（比如反复读取 SPI 文件）；
     * 实现懒加载 + 单例式管理插件实例。
     */
    private static final Map<String, Plugin> pluginMap = new HashMap<>();

    /**
     * 静态代码块实现一次性初始化
     * 作用：类第一次被加载时就自动执行，不需要手动调用初始化方法。
     * 好处：保证只初始化一次，提升效率。
     */
    static {
        ServiceLoader<Plugin> load = ServiceLoader.load(Plugin.class);
        for (Plugin plugin : load) {
            pluginMap.put(plugin.getName(), plugin);
        }
    }

    public static Plugin getPlugin(String name) {
        return pluginMap.get(name);
    }

    public static List<Plugin> getPlugins() {
        return new ArrayList<>(pluginMap.values());
    }

}
